import streamlit as st
import json
import time
from datetime import datetime
from pathlib import Path
import plotly.express as px
import pandas as pd

from config import settings, validate_config
from graph_builder import create_workflow
from utils import logger

# 页面配置
st.set_page_config(
    page_title="CodeBuddy - 多智能体协同编程助手",
    page_icon="🤖",
    layout="wide",
    initial_sidebar_state="expanded"
)

# 自定义CSS
st.markdown("""
<style>
    .main-header {
        font-size: 3rem;
        color: #1f77b4;
        text-align: center;
        margin-bottom: 2rem;
    }
    .agent-card {
        background: linear-gradient(90deg, #667eea 0%, #764ba2 100%);
        padding: 1rem;
        border-radius: 0.5rem;
        color: white;
        margin: 0.5rem 0;
    }
    .success-message {
        background: #d4edda;
        border: 1px solid #c3e6cb;
        color: #155724;
        padding: 1rem;
        border-radius: 0.5rem;
        margin: 1rem 0;
    }
    .error-message {
        background: #f8d7da;
        border: 1px solid #f5c6cb;
        color: #721c24;
        padding: 1rem;
        border-radius: 0.5rem;
        margin: 1rem 0;
    }
</style>
""", unsafe_allow_html=True)

def main():
    """主界面"""
    
    # 标题
    st.markdown('<h1 class="main-header">🤖 CodeBuddy</h1>', unsafe_allow_html=True)
    st.markdown('<p style="text-align: center; font-size: 1.2rem; color: #666;">多智能体协同编程助手</p>', unsafe_allow_html=True)
    
    # 侧边栏
    with st.sidebar:
        st.header("🛠️ 控制面板")
        
        # 配置检查
        try:
            validate_config()
            st.success("✅ 配置验证通过")
        except ValueError as e:
            st.error(f"❌ 配置错误: {e}")
            st.info("请在项目根目录创建 .env 文件并配置 ZHIPU_API_KEY")
            return
        
        # 功能选择
        page = st.selectbox(
            "选择功能",
            ["🏠 主页", "🚀 生成代码", "📊 代理统计", "📚 使用指南", "🎯 演示示例"]
        )
    
    # 路由到不同页面
    if page == "🏠 主页":
        show_homepage()
    elif page == "🚀 生成代码":
        show_code_generation()
    elif page == "📊 代理统计":
        show_agent_stats()
    elif page == "📚 使用指南":
        show_user_guide()
    elif page == "🎯 演示示例":
        show_demo_examples()

def show_homepage():
    """显示主页"""
    st.header("🎯 功能特性")
    
    # 功能特性卡片
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.markdown("""
        <div class="agent-card">
            <h3>🎯 需求分析</h3>
            <p>智能理解用户需求，制定详细的功能规划</p>
        </div>
        """, unsafe_allow_html=True)
    
    with col2:
        st.markdown("""
        <div class="agent-card">
            <h3>🏗️ 架构设计</h3>
            <p>设计可扩展的系统架构和技术方案</p>
        </div>
        """, unsafe_allow_html=True)
    
    with col3:
        st.markdown("""
        <div class="agent-card">
            <h3>💻 代码生成</h3>
            <p>自动生成高质量、可运行的代码</p>
        </div>
        """, unsafe_allow_html=True)
    
    with col4:
        st.markdown("""
        <div class="agent-card">
            <h3>🔍 质量保证</h3>
            <p>代码审查、测试、安全检查和优化</p>
        </div>
        """, unsafe_allow_html=True)
    
    # AI代理介绍
    st.header("🤖 AI代理团队")
    
    agents_info = [
        {"name": "产品经理", "role": "需求分析和功能规划", "icon": "🎯"},
        {"name": "架构师", "role": "系统设计和技术选型", "icon": "🏗️"},
        {"name": "开发者", "role": "代码实现和编程", "icon": "💻"},
        {"name": "测试工程师", "role": "测试用例生成和执行", "icon": "🧪"},
        {"name": "代码审查员", "role": "代码质量审查", "icon": "🔍"},
        {"name": "安全专家", "role": "安全漏洞检测", "icon": "🔒"},
        {"name": "优化专家", "role": "性能优化建议", "icon": "⚡"},
        {"name": "文档专家", "role": "文档生成和维护", "icon": "📚"}
    ]
    
    # 显示代理信息
    for i, agent in enumerate(agents_info):
        if i % 2 == 0:
            col1, col2 = st.columns(2)
        
        with col1 if i % 2 == 0 else col2:
            st.info(f"{agent['icon']} **{agent['name']}**: {agent['role']}")
    
    # 工作流程
    st.header("🔄 工作流程")
    
    workflow_steps = [
        "🎯 需求分析 → 理解用户需求，制定功能规划",
        "🏗️ 架构设计 → 设计系统架构和技术方案", 
        "💻 代码开发 → 生成完整的代码实现",
        "🧪 代码测试 → 生成并执行测试用例",
        "🔍 代码审查 → 质量检查和改进建议",
        "🔒 安全检查 → 漏洞检测和安全加固",
        "⚡ 性能优化 → 性能分析和优化建议",
        "📚 文档生成 → 自动生成项目文档"
    ]
    
    for step in workflow_steps:
        st.write(f"• {step}")

def show_code_generation():
    """显示代码生成页面"""
    st.header("🚀 AI代码生成")
    
    # 输入区域
    st.subheader("📝 需求输入")
    
    # 预设示例
    example_requirements = {
        "命令行计算器": "创建一个命令行计算器，支持四则运算、历史记录和科学计算功能",
        "任务管理器": "开发一个简单的任务管理器，可以添加、删除、标记完成任务，支持优先级和分类",
        "文件整理工具": "实现一个文件整理工具，按文件类型自动分类整理，支持重复文件检测",
        "Web API": "构建一个简单的Web API，提供用户注册、登录、JWT认证功能",
        "数据分析脚本": "编写一个数据分析脚本，读取CSV文件，进行数据清洗和可视化",
        "自定义": ""
    }
    
    selected_example = st.selectbox("选择示例或自定义输入：", list(example_requirements.keys()))
    
    if selected_example == "自定义":
        user_requirement = st.text_area("请详细描述您的需求：", height=150)
    else:
        user_requirement = st.text_area(
            "需求描述：", 
            value=example_requirements[selected_example],
            height=150
        )
    
    # 高级选项
    with st.expander("⚙️ 高级选项"):
        col1, col2 = st.columns(2)
        
        with col1:
            selected_steps = st.multiselect(
                "选择执行步骤（空则执行全部）：",
                ["product_manager", "architect", "developer", "tester", "reviewer", "security_checker", "optimizer", "documenter"],
                default=[]
            )
        
        with col2:
            save_results = st.checkbox("保存结果到本地", value=True)
            show_progress = st.checkbox("显示详细进度", value=True)
    
    # 生成按钮
    if st.button("🚀 开始生成", type="primary", use_container_width=True):
        if not user_requirement.strip():
            st.error("请输入需求描述！")
            return
        
        generate_code(user_requirement, selected_steps, save_results, show_progress)

def generate_code(requirement: str, steps: list, save_results: bool, show_progress: bool):
    """执行代码生成"""
    
    # 进度条
    progress_bar = st.progress(0)
    status_text = st.empty()

    try:
        # 创建工作流
        status_text.text("🔧 初始化AI代理...")
        if 'workflow' not in st.session_state:
            st.session_state.workflow = create_workflow()

        workflow = st.session_state.workflow  # 使用持久化的工作流实例

        progress_bar.progress(10)
        
        # 执行工作流
        status_text.text("🚀 开始多智能体协作...")


        if steps:
            result = workflow.execute_partial(requirement, steps)
        else:
            result = workflow.execute(requirement)
        
        progress_bar.progress(100)
        
        # 显示结果
        if result['success']:
            status_text.markdown('<div class="success-message">🎉 生成完成！</div>', unsafe_allow_html=True)
            
            # 显示摘要
            if 'summary' in result:
                display_execution_summary(result['summary'])
            
            # 显示详细结果
            display_results(result['results'])
            
            # 保存结果
            if save_results:
                save_results_to_session(result, requirement)
        
        else:
            status_text.markdown(f'<div class="error-message">❌ 生成失败: {result.get("error", "未知错误")}</div>', unsafe_allow_html=True)
            
            if result.get('errors'):
                st.error("错误详情：")
                for error in result['errors']:
                    st.write(f"• {error['step']}: {error['error']}")
    
    except Exception as e:
        progress_bar.progress(0)
        status_text.markdown(f'<div class="error-message">❌ 执行失败: {str(e)}</div>', unsafe_allow_html=True)
        st.exception(e)

def display_execution_summary(summary: dict):
    """显示执行摘要"""
    st.subheader("📊 执行摘要")
    
    col1, col2, col3, col4 = st.columns(4)
    
    with col1:
        st.metric("总步骤", summary['total_steps'])
    
    with col2:
        st.metric("成功步骤", summary['successful_steps'])
    
    with col3:
        st.metric("执行时间", f"{summary['execution_time']}秒")
    
    with col4:
        st.metric("成功率", f"{summary['success_rate']:.1f}%")

def display_results(results: dict):
    """显示详细结果"""
    st.subheader("📋 生成结果")
    
    # 结果标签页
    tabs = st.tabs([step_name.replace('_', ' ').title() for step_name in results.keys()])
    
    for i, (step_name, step_result) in enumerate(results.items()):
        with tabs[i]:
            if step_result.get('success', True):
                st.success(f"✅ {step_result.get('summary', '完成')}")
                
                # 显示主要内容
                for key, value in step_result.items():
                    if key not in ['success', 'summary'] and isinstance(value, str):
                        st.subheader(f"📄 {key.replace('_', ' ').title()}")
                        
                        # 代码高亮
                        if 'code' in key.lower():
                            st.code(value, language='python')
                        else:
                            st.markdown(value)
                
                # 显示代码文件（如果有）
                if 'code_files' in step_result:
                    st.subheader("📁 生成的文件")
                    
                    for file_path, code_content in step_result['code_files'].items():
                        with st.expander(f"📄 {file_path}"):
                            st.code(code_content, language='python')
            
            else:
                st.error(f"❌ {step_result.get('error', '执行失败')}")

def save_results_to_session(result: dict, requirement: str):
    """保存结果到session state"""
    if 'saved_results' not in st.session_state:
        st.session_state.saved_results = []
    
    st.session_state.saved_results.append({
        'timestamp': datetime.now().isoformat(),
        'requirement': requirement,
        'result': result
    })
    
    st.success("💾 结果已保存到会话中")

def show_agent_stats():
    """显示代理统计"""
    st.header("📊 AI代理统计")

    if 'workflow' not in st.session_state:
        st.info("暂无统计数据，请先执行一次代码生成。")
        return

    try:
        stats = st.session_state.workflow.get_agent_stats()
        
        if not stats:
            st.info("暂无统计数据，请先执行一次代码生成。")
            return
        
        # 统计概览
        st.subheader("📈 统计概览")
        
        # 转换为DataFrame
        df_data = []
        for agent_name, stat in stats.items():
            df_data.append({
                '代理名称': stat['name'],
                '角色': stat['role'],
                '调用次数': stat['performance']['total_calls'],
                '成功率': float(stat['performance']['success_rate'].replace('%', '')),
                '总Token数': stat['metadata']['total_tokens']
            })
        
        df = pd.DataFrame(df_data)
        
        if not df.empty:
            # 显示表格
            st.dataframe(df, use_container_width=True)
            
            # 可视化图表
            col1, col2 = st.columns(2)
            
            with col1:
                st.subheader("📊 调用次数分布")
                if df['调用次数'].sum() > 0:
                    fig = px.bar(df, x='代理名称', y='调用次数', 
                                title="各代理调用次数",
                                color='调用次数',
                                color_continuous_scale='Blues')
                    st.plotly_chart(fig, use_container_width=True)
                else:
                    st.info("暂无调用数据")
            
            with col2:
                st.subheader("🎯 成功率分析")
                if df['成功率'].sum() > 0:
                    fig = px.pie(df, values='成功率', names='代理名称',
                                title="成功率分布")
                    st.plotly_chart(fig, use_container_width=True)
                else:
                    st.info("暂无成功率数据")
        
        # 历史记录
        if 'saved_results' in st.session_state and st.session_state.saved_results:
            st.subheader("📚 执行历史")
            
            for i, record in enumerate(reversed(st.session_state.saved_results[-5:])):  # 显示最近5次
                with st.expander(f"🕒 {record['timestamp'][:19]} - {record['requirement'][:50]}..."):
                    st.write(f"**需求**: {record['requirement']}")
                    
                    if record['result']['success']:
                        st.success(f"✅ 成功 - 成功率: {record['result']['summary']['success_rate']:.1f}%")
                    else:
                        st.error("❌ 失败")
    
    except Exception as e:
        st.error(f"获取统计信息失败: {e}")

def show_user_guide():
    """显示使用指南"""
    st.header("📚 使用指南")
    
    st.markdown("""
    ## 🚀 快速开始
    
    ### 1. 环境配置
    - 确保已安装Python 3.8+
    - 安装依赖：`pip install -r requirements.txt`
            - 配置智谱清言 API Key到 `.env` 文件
    
    ### 2. 使用方式
    
    #### 命令行模式
    ```bash
    # 基本使用
    python main.py run "创建一个计算器"
    
    # 交互式模式
    python main.py run --interactive
    
    # 指定输出目录
    python main.py run "需求描述" --output ./output
    
    # 运行演示
    python main.py demo
    ```
    
    #### Web界面模式
    ```bash
    # 启动Web界面
    python main.py web
    # 或者直接运行
    streamlit run web_interface.py
    ```
    
    ### 3. 功能说明
    
    #### 🎯 需求分析
    - 自动理解用户需求
    - 拆解功能点和优先级
    - 制定验收标准
    
    #### 🏗️ 架构设计  
    - 技术栈选择建议
    - 系统架构设计
    - 模块划分和接口定义
    
    #### 💻 代码生成
    - 生成完整可运行的代码
    - 遵循编码规范
    - 包含错误处理和日志
    
    #### 🧪 测试生成
    - 自动生成单元测试
    - 集成测试和性能测试
    - 测试覆盖率分析
    
    #### 🔍 代码审查
    - 代码质量评估
    - 安全漏洞检测
    - 性能优化建议
    
    #### 📚 文档生成
    - README和API文档
    - 使用指南和部署文档
    - 架构图和流程图
    
    ### 4. 最佳实践
    
    - **明确需求**：尽量详细描述功能需求和技术要求
    - **分步执行**：复杂项目可以分步骤执行
    - **结果保存**：及时保存重要的生成结果
    - **迭代改进**：根据反馈持续优化需求描述
    
    ### 5. 故障排除
    
    #### 常见问题
    
    **Q: API Key配置问题**
            A: 确保在 `.env` 文件中正确配置 `ZHIPU_API_KEY=your_key_here`
    
    **Q: 代码生成失败**
    A: 检查网络连接和API额度，尝试重新运行
    
    **Q: 依赖安装问题**  
    A: 使用 `pip install -r requirements.txt` 安装所有依赖
    
    **Q: 生成的代码无法运行**
    A: 检查Python版本和缺失的依赖包
    
    ### 6. 技术支持
    
    - 查看项目文档和源码
    - 提交Issue反馈问题
    - 参与社区讨论和改进
    """)

def show_demo_examples():
    """显示演示示例"""
    st.header("🎯 演示示例")
    
    st.info("选择一个示例来体验CodeBuddy的强大功能！")
    
    examples = {
        "🧮 命令行计算器": {
            "description": "创建一个功能完整的命令行计算器",
            "requirement": """
创建一个命令行计算器，具备以下功能：
1. 支持基本四则运算（+、-、*、/）
2. 支持括号优先级计算
3. 支持科学计算（sin、cos、sqrt等）
4. 历史记录功能
5. 错误处理和输入验证
6. 友好的用户界面
            """.strip()
        },
        "📝 任务管理器": {
            "description": "开发一个简单但实用的任务管理工具",
            "requirement": """
开发一个任务管理器，包含以下功能：
1. 任务的增删改查操作
2. 任务状态管理（待办、进行中、已完成）
3. 任务优先级设置（高、中、低）
4. 任务分类和标签功能
5. 截止日期提醒
6. 数据持久化存储
7. 简洁的命令行界面
            """.strip()
        },
        "📁 文件整理工具": {
            "description": "自动化文件分类和整理工具",
            "requirement": """
实现一个智能文件整理工具：
1. 按文件扩展名自动分类
2. 重复文件检测和处理
3. 文件大小统计分析
4. 支持自定义分类规则
5. 批量重命名功能
6. 安全的文件操作（支持撤销）
7. 进度显示和日志记录
            """.strip()
        },
        "🌐 Web API服务": {
            "description": "构建一个完整的RESTful API服务",
            "requirement": """
构建一个用户管理Web API，包含：
1. 用户注册和登录接口
2. JWT Token认证机制
3. 用户信息的CRUD操作
4. 密码加密和安全处理
5. 输入验证和错误处理
6. API文档和测试接口
7. 数据库集成（SQLite）
8. 日志记录和监控
            """.strip()
        }
    }
    
    selected_example = st.selectbox(
        "选择演示示例：",
        list(examples.keys())
    )
    
    if selected_example:
        example = examples[selected_example]
        
        st.subheader(f"📋 {selected_example}")
        st.write(example["description"])
        
        st.subheader("📝 详细需求")
        st.code(example["requirement"], language="text")
        
        if st.button(f"🚀 生成 {selected_example}", type="primary", use_container_width=True):
            generate_code(example["requirement"], [], True, True)

if __name__ == "__main__":
    main() 